package com.udistrisisbici.dao;

import com.udistrisisbici.exception.DaoException;
import com.udistrisisbici.util.logs.Logger;
import com.udistrisisbici.vo.UsuarioVO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author nicardonaa
 */
public class UsuarioDao extends UtilDao {

    public static Logger logger;

    static {
        logger = Logger.getLogger(UsuarioDao.class);
    }

    public int insertarUsuario(UsuarioVO usuVO) throws DaoException, SQLException {

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int respuesta = 0;
        try {

            con = getConeccionSisbici();
            String sentenciaSql = "INSERT INTO public.usuario(identificacion_usu, cod_ud, nombres, apellidos, telefono) VALUES( ?, ?, ?, ?, ?)";
            ps = con.prepareStatement(sentenciaSql);
            int i = 1;

            ps.setString(i++, usuVO.getNumIdentificacion());
            ps.setString(i++, usuVO.getCodigoUD());
            ps.setString(i++, usuVO.getNombres());
            ps.setString(i++, usuVO.getApellidos());
            ps.setString(i++, usuVO.getTelefono());

            StringBuilder sbLog = new StringBuilder();
            sbLog.append("SQL log: [").append(sentenciaSql).append("]");
            sbLog.append(usuVO.getNumIdentificacion()).append(", ");
            sbLog.append(usuVO.getCodigoUD()).append(", ");
            sbLog.append(usuVO.getNombres()).append(", ");
            sbLog.append(usuVO.getApellidos()).append(", ");
            sbLog.append(usuVO.getTelefono()).append("]");

            logger.info(sbLog.toString());

            long t1 = System.currentTimeMillis();
            respuesta = ps.executeUpdate();
            long t2 = System.currentTimeMillis();

            logger.info("Tiempo SQL: " + (t2 - t1) + "ms.");

        } catch (DaoException de) {
            logger.error("fun:insertarUsuario -> Error de conexión en la ejecuciópn del SQL", de);
            throw de;
        } catch (SQLException se) {
            logger.error("fun:insertarUsuario -> Error en la ejecución del SQL", se);
            throw se;
        } finally {
            closeResources(con, ps, rs);
        }

        return respuesta;
    }

    /**
     *
     * @param usuVO
     * @return
     * @throws DaoException
     * @throws SQLException
     */
    public List<UsuarioVO> buscarUsuario(UsuarioVO usuVO) throws DaoException, SQLException {

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<UsuarioVO> usus = new ArrayList<UsuarioVO>();

        try {
            con = getConeccionSisbici();
            StringBuilder sql = new StringBuilder();
            sql.append("SELECT identificacion_usu, cod_ud, nombres, apellidos, telefono ");
            sql.append("FROM public.usuario ");
            sql.append("where identificacion_usu is not null ");

            if (usuVO.getNumIdentificacion() != null && !usuVO.getNumIdentificacion().equals("")) {
                sql.append("and identificacion_usu = ? ");
            }
            if (usuVO.getCodigoUD() != null && !usuVO.getCodigoUD().equals("")) {
                sql.append("and cod_ud = ? ");
            }
            if (usuVO.getNombres() != null && !usuVO.getNombres().equals("")) {
                sql.append("and nombres = ? ");
            }
            if (usuVO.getApellidos() != null && !usuVO.getApellidos().equals("")) {
                sql.append("and apellidos = ? ");
            } if (usuVO.getTelefono() != null && !usuVO.getTelefono().equals("")) {
                sql.append("and telefono = ? ");
            }

            ps = con.prepareStatement(sql.toString());
            int i = 1;

            if (usuVO.getNumIdentificacion() != null && !usuVO.getNumIdentificacion().equals("")) {
                ps.setString(i++, usuVO.getNumIdentificacion());
            }
            if (usuVO.getCodigoUD() != null && !usuVO.getCodigoUD().equals("")) {
                ps.setString(i++, usuVO.getCodigoUD());
            }
            if (usuVO.getNombres() != null && !usuVO.getNombres().equals("")) {
                ps.setString(i++, usuVO.getNombres());
            }
            if (usuVO.getApellidos() != null && !usuVO.getApellidos().equals("")) {
                ps.setString(i++, usuVO.getApellidos());
            }
            if (usuVO.getTelefono() != null && !usuVO.getTelefono().equals("")) {
                ps.setString(i++, usuVO.getTelefono());
            }
 
            rs = ps.executeQuery();

            UsuarioVO item;
            while (rs.next()) {
                item = new UsuarioVO();
                item.setNumIdentificacion(rs.getString(1));
                item.setCodigoUD(rs.getString(2));
                item.setNombres(rs.getString(3));
                item.setApellidos(rs.getString(4));
                item.setTelefono(rs.getString(5));
                usus.add(item);
            }

        } catch (DaoException de) {
            logger.error("fun:buscarCanalAfiliacionByCodCanal -> Error de conexión en la ejecuciópn del SQL", de);
            throw de;
        } catch (SQLException se) {
            logger.error("fun:buscarCanalAfiliacionByCodCanal -> Error en la ejecución del SQL", se);
            throw se;
        } finally {
            closeResources(con, ps, rs);
        }

        return usus;
    }

    /**
     *
     * @param id
     * @return
     * @throws DaoException
     * @throws SQLException
     */
    public UsuarioVO buscarUsuarioPorId(String id) throws DaoException, SQLException {

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        UsuarioVO usuID = null;

        try {
            con = getConeccionSisbici();
            StringBuilder sql = new StringBuilder();
            sql.append("SELECT identificacion_usu, cod_ud, nombres, apellidos, telefono ");
            sql.append("FROM public.usuario ");
            sql.append("where identificacion_usu = ?");

            ps = con.prepareStatement(sql.toString());
            int i = 1;

            ps.setString(i++, id);

            StringBuilder sbLog = new StringBuilder();
            sbLog.append("SQL log: [").append(sql.toString()).append("]");
            sbLog.append(id).append("]");

            logger.info(sbLog.toString());

            long t1 = System.currentTimeMillis();
            rs = ps.executeQuery();
            long t2 = System.currentTimeMillis();

            logger.info("Tiempo SQL: " + (t2 - t1) + "ms.");

            if (rs.next()) {
                usuID = new UsuarioVO();
                usuID.setNumIdentificacion(rs.getString(1));
                usuID.setCodigoUD(rs.getString(2));
                usuID.setNombres(rs.getString(3));
                usuID.setApellidos(rs.getString(4));
                usuID.setTelefono(rs.getString(5));
            }

        } catch (DaoException de) {
            logger.error("fun:buscarUsuarioPorId -> Error de conexión en la ejecuciópn del SQL", de);
            throw de;
        } catch (SQLException se) {
            logger.error("fun:buscarUsuarioPorId -> Error en la ejecución del SQL", se);
            throw se;
        } finally {
            closeResources(con, ps, rs);
        }

        return usuID;
    }

}
